/*************************************************************************
	> File Name: main.h
	> Author: QiyangXia
	> Mail: 834061456@qq.com 
	> Created Time: 2021年12月31日 星期五 17时30分13秒
 ***********************************************************************/
#ifndef MAIN_H
#define MAIN_H
#include <sys/types.h>
#include <sys/wait.h>

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <unistd.h>
#include <time.h>

#define NAME_LEN 20
#define N 100

struct stu
{
	int no;
	char name[NAME_LEN];
	char sex;
	float math;
	float english;
	float chinese;
};
typedef struct stu T;

struct node
{
	T data;
	struct node *pnext;
};

struct linklist
{
	int len;
	struct node *pfirst;
};
char *mygets(char *pout,int size);
int mainloop(struct linklist *plls,int max);
int ui();

//建表：给引擎对象分配空间
struct linklist *create_linklist();

//清空表：将所有节点空间释放，置头节点的len成员为0，pfirst成员为NULL
int clear_linklist(struct linklist *plink);

//删表：先清空表，然后再释放头节点的空间
int destroy_linklist(struct linklist *plink);

//创建一个节点
struct node *create_node(T *pdata);

//销毁一个节点：释放节点占用的内存空间
int destroy_node(struct node *pnode);

//求表长
int get_linklist_len(struct linklist *plink);

//判空
int is_empty_linklist(struct linklist *plink);


//尾插：新元素插入链表，作为链表中的最后一个节点
int insert_at_tail(struct linklist *plink,struct node *pnew);

struct node * remove_at_head(struct linklist *plink);
//移除指定节点
int remove_a_node(struct linklist *plink,struct node *pnode);

//修改:
int modify(struct node *pnode,T *pdata);

//查找：
struct node * search_by_name(struct linklist *plink,char *name);
struct node * search_by_no(struct linklist *plink,int *no);

//排序方案2-----借助存放节点地址的动态数组 ---- 不会改变链表中节点的相互位置
struct node **sort_person_linklist_by_all(struct linklist *plink);
struct node **sort_person_linklist_by_math(struct linklist *plink);
struct node **sort_person_linklist_by_english(struct linklist *plink);
struct node **sort_person_linklist_by_chinese(struct linklist *plink);
int print_sort_result(struct node **ppsorted,int cnt);
int free_sort_result(struct node **ppsorted);
//打印所有联系人
int print_all_person(struct linklist *plink);
//打印一个联系人
int print_a_person(struct node *pnode);
int write_in(struct linklist *plink);
static char *myreadline(FILE *pf);
int read_in(struct linklist *plink);


#endif
